package com.it.you.controller.file;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * @author: YouHui
 * @Created: 2023/4/10 17:14
 */
@Component
public class FileController {

    @Value("file.path")
    private String filePath;

    private static final Logger log = LoggerFactory.getLogger(FileController.class);


    public void exportTxt(String fileName, HttpServletResponse response, String text) {
        log.info("导出中......");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/plain");
        //设置文件的名称和格式
        response.addHeader("Content-Disposition", "attachment;filename="
                + "a" + ".txt");//设置名称格式，没有这个中文名称无法显示
        BufferedOutputStream buff = null;
        ServletOutputStream outStr = null;
        try {
            outStr = response.getOutputStream();
            buff = new BufferedOutputStream(outStr);
            buff.write(text.getBytes("UTF-8"));
            buff.flush();
            buff.close();
        } catch (Exception e) {
            //LOGGER.error("导出文件文件出错:{}",e);
        } finally {
            try {
                buff.close();
                outStr.close();
            } catch (Exception e) {
                //LOGGER.error("关闭流对象出错 e:{}",e);
            }
            log.info("导出结束.............");
        }
    }

    //防止中文文件名显示出错
    public String genAttachmentFileName(String cnName, String defaultName) {
        try {
            cnName = new String(cnName.getBytes("gb2312"), "ISO8859-1");
        } catch (Exception e) {
            cnName = defaultName;
        }
        return cnName;
    }


    /**
     * 文件上传
     *
     * 测试时需要注意：
     * 1、先调用/percent接口一次，之后再调用/upload接口。如果先调用/upload，再调用/percent，
     *    是看不到进度数据的。这是因为需要预先建立起会话，才能记录进度；而如果先上传的话，
     *    因为上传会占用整个进程，一直到上传结束，才会完成session会话的初始化；
     * 2、最好上传大文件，方便观测效果；
     * 3、在上传过程中，连续调用/percent接口，可以看到上传进度数据不断变化。
     * 第一次也可以调用/upload，但直到/upload完成上传之前，调用/percent都没响应。
     * 第一次的/upload完成后，第二次调用/upload，再调用/percent就可以看到效果了
     *
     * 作者：湘王
     * 链接：https://juejin.cn/post/7193657772989218875
     * 来源：稀土掘金
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        StringBuffer buffer = new StringBuffer();
        //获取文件名
        String filename = file.getOriginalFilename();
        try {
            File target = new File(filePath + filename);
            file.transferTo(target);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "upload success";
    }

    /**
     * 获取上传进度
     * @param request
     * @return
     */
    @GetMapping("/percent")
    public Object percent(HttpServletRequest request) {
        HttpSession session = request.getSession();

        return session.getAttribute("percent");
    }

}
